In a conventional computer system, software routines exist for interfacing between the operating system and specific peripheral devices. Such software routines are called device drivers. Typically, device drivers operate by instructing peripheral devices to perform input and output (I/O) functions. Device drivers perform input and output operations based on commands which are received from the operating system. In a Unix environment, each peripheral device in the computer system is associated with a device driver.
In Unix system development, it is often necessary to create various device drivers for the numerous peripheral devices which may be connected to a computer system. These peripheral devices include disk drive units and tape drive units. Furthermore, such peripheral devices are integrated with a current Unix operating System. Typically, the creation of such device drivers is performed by duplicating an existing device driver and modifying it in accordance with the particularities of a new peripheral device or peripheral device controller. One drawback of this approach is that duplicate code is placed in each device driver to support operating system and application interfaces. Thus, if new features are later incorporated into the computer system, each device driver must be individually modified to ensure proper interfacing between current device drivers and an altered operating system environment. Another drawback of this approach is the excessive memory use caused by code duplication.
Another problem which exists in tape drive device drivers is the lack of buffering between these device drivers and the Unix operating system (i.e. the kernel). Thus, user application software requires particular programming to ensure that it is compatible with the characteristics of a given tape device. This may require the modification of existing software to improve tape drive performance. Many programmers use the Unix system buffer mechanism to provide a buffered environment. However, this mechanism was originally designed for use with random access devices. So, by virtue of the limitations that it places on various types of tape formats, it is not entirely suitable for tape drive use.
Additional system integration problems are caused by the large number of disk device driver configurations which are necessary to support a variety of disk controllers. In a typical Unix system, the kernel must be customized (i.e. relinked followed by a system reboot) to select a specific disk device driver and disk unit to be used as a root file system (i.e. the point of growth for all other files in the file system) and as a swap file system (i.e. the location where memory images of programs which have been temporarily swapped out of memory are stored). This process of customizing the boot disk driver must be performed on a fully installed system and must be completed before the system may be used.
Typically, during the development of a Unix operating system, a separate operating system kernel is created for each possible configuration of peripheral devices. These kernels are built in advance and result in a potentially large number of kernels to accommodate the variety of supported disk controllers. Some vendors provide a large number of Unix kernels, allowing the user to chose the one appropriate for his system configuration at installation. Other vendors simply require that a given type of controller exist as the controller for the boot disk.